package mx.frantor.catalogos.daoimp;

import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import mx.frantor.catalogos.dao.HistEstatusDetallePedidoDAO;
import mx.frantor.catalogos.entitys.HistEstatusDetallePedidoEntity;
import mx.frantor.util.HibernateUtil;

public class HistEstatusDetallePedidoDAOImpl implements HistEstatusDetallePedidoDAO{

	@Override
	public String agregarEstatus(HistEstatusDetallePedidoEntity nuevoEstatus) {
		String e = "";
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		
		session.beginTransaction();
		try {
		session.save(nuevoEstatus);
		session.flush();
		session.getTransaction().commit();
		e = nuevoEstatus.getIdHistEstatusDetallePedido().toString();
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage();
			//return e.toString();
		}
		HibernateUtil.getSessionFactory().getCurrentSession().close();

		System.out.println("agregar EstatusDetallePedido resultado " + e);

		return e;
	}

	@Override
	public String modificarEstatus(HistEstatusDetallePedidoEntity modificarEstatus) {
		// TODO Auto-generated method stub
				String e = "";
				Session session = HibernateUtil.getSessionFactory()
						.getCurrentSession();
			
				session.beginTransaction();
				try {
					HistEstatusDetallePedidoEntity estDetPedTemp = (HistEstatusDetallePedidoEntity) session.get(
							HistEstatusDetallePedidoEntity.class, modificarEstatus.getIdHistEstatusDetallePedido());
				session.flush();
				session.evict(estDetPedTemp);
				session.update(modificarEstatus);
				session.getTransaction().commit();
				} catch (Exception x) {
					//e.printStackTrace();
					session.getTransaction().rollback();
					e = x.getMessage();
					//return e.toString();
				}
				HibernateUtil.getSessionFactory().getCurrentSession().close();

				System.out.println("modificar EstatusDetallePedido resultado " + e);

				return e;
	}

	@Override
	public String eliminarEstatus(long idestatusdetallepedido) {
		// TODO Auto-generated method stub
				String e = "";
				Session session = HibernateUtil.getSessionFactory()
						.getCurrentSession();		
					session.beginTransaction();
					try {
						HistEstatusDetallePedidoEntity estDetPedElimina = (HistEstatusDetallePedidoEntity) session.get(
								HistEstatusDetallePedidoEntity.class, idestatusdetallepedido);
					session.delete(estDetPedElimina);
					session.getTransaction().commit();
				} catch (Exception x) {
					//e.printStackTrace();
					session.getTransaction().rollback();
					e = x.getMessage().toString();
					//return e.toString();
				}
				//HibernateUtil.getSessionFactory().getCurrentSession().close();
				HibernateUtil.getSessionFactory().getCurrentSession().close();
				System.out.println("eliminar EstatusDetallePedido resultado " + e);

				
				return e;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<HistEstatusDetallePedidoEntity> getTodosEstatusActivos() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<HistEstatusDetallePedidoEntity> clientes = session.createCriteria(HistEstatusDetallePedidoEntity.class)
				.addOrder(Order.asc("IdHistEstatusDetallePedido")).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		return clientes;
	}

	@SuppressWarnings("unchecked")
	@Override
	public HistEstatusDetallePedidoEntity getEstatusId(long idEstatusDetallePedido) {
		// TODO Auto-generated method stub
				Session session = HibernateUtil.getSessionFactory().getCurrentSession();
				session.beginTransaction();
				List<HistEstatusDetallePedidoEntity> estatusDetPed = (List<HistEstatusDetallePedidoEntity>) 
						session.createCriteria(HistEstatusDetallePedidoEntity.class)
						.add(Restrictions.eq("IdHistEstatusDetallePedido", idEstatusDetallePedido))
						.setFetchSize(1).list();
				HibernateUtil.getSessionFactory().getCurrentSession().close();
				try{
					return estatusDetPed.get(0);
				}catch (Exception x) {
					return null;
				}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<HistEstatusDetallePedidoEntity> getEstatusPorId(
			long idEstatusDetallePedido) {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<HistEstatusDetallePedidoEntity> lstEstatusDetPed = (List<HistEstatusDetallePedidoEntity>) session.createCriteria(HistEstatusDetallePedidoEntity.class)
				.add(Restrictions.eq("IdHistEstatusDetallePedido", idEstatusDetallePedido))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		
		return lstEstatusDetPed;
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<HistEstatusDetallePedidoEntity> getEstatusPorIdDetallePedido(
			long idDetallePedido) {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<HistEstatusDetallePedidoEntity> lstEstatusDetPed = (List<HistEstatusDetallePedidoEntity>) 
				session.createCriteria(HistEstatusDetallePedidoEntity.class)
				.add(Restrictions.eq("IdDetallePedido", idDetallePedido))
				.addOrder(Order.asc("Estatus"))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		
		return lstEstatusDetPed;
	}

	@SuppressWarnings("unchecked")
	@Override
	public int eliminarEstatusDetener(long idDetPed, String estatus) {
		String e = "";
		int cant=0;
		Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();		
			session.beginTransaction();
			try {
				List<HistEstatusDetallePedidoEntity> lstEstatusDetPed = (List<HistEstatusDetallePedidoEntity>) 
						session.createCriteria(HistEstatusDetallePedidoEntity.class)
						.add(Restrictions.eq("IdDetallePedido", idDetPed))
						.add(Restrictions.not(Restrictions.eq("Estatus", estatus)))
						.list();
				for(HistEstatusDetallePedidoEntity estatusDetPed:lstEstatusDetPed){
					cant += estatusDetPed.getCantidad();
					session.delete(estatusDetPed);
				}
				session.getTransaction().commit();
			
		} catch (Exception x) {
			//e.printStackTrace();
			session.getTransaction().rollback();
			e = x.getMessage().toString();
			//return e.toString();
		}
		//HibernateUtil.getSessionFactory().getCurrentSession().close();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		System.out.println("eliminarCancelar EstatusDetallePedido resultado " + e);

		
		return cant;
	}

	@SuppressWarnings("unchecked")
	@Override
	public HistEstatusDetallePedidoEntity getEstatusIdDetEstatus(long idDetPed,
			String estatusAct) {
		// TODO Auto-generated method stub
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<HistEstatusDetallePedidoEntity> estatusDetPed = (List<HistEstatusDetallePedidoEntity>) session.createCriteria(HistEstatusDetallePedidoEntity.class)
				.add(Restrictions.eq("IdDetallePedido", idDetPed))
				.add(Restrictions.eq("Estatus", estatusAct))
				.setFetchSize(1).list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		try{
			return estatusDetPed.get(0);
		}catch (Exception x) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<HistEstatusDetallePedidoEntity> getEstatusPorEstatus(
			String encargado, Date fecha, Date oFecha) {
		// TODO Auto-generated method stub
		fecha.setHours(0);
		fecha.setMinutes(0);
		fecha.setSeconds(0);
		oFecha.setHours(0);
		oFecha.setMinutes(0);
		oFecha.setSeconds(0);
		int dia = oFecha.getDate();
		Date fechaAnt = fecha;
		Date fechaSig = oFecha;
		//fechaAnt.setDate(dia-1);
		fechaSig.setDate(dia+1);
		System.out.println("DAO \n" + fechaAnt.toString() + "\n" + fechaSig.toString());
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<HistEstatusDetallePedidoEntity> lstEstatusDetPed = (List<HistEstatusDetallePedidoEntity>) session.createCriteria(HistEstatusDetallePedidoEntity.class)
				.add(Restrictions.eq("Encargado", encargado)).add(Restrictions.between("Fecha", fechaAnt,fechaSig)).addOrder(Order.asc("Fecha"))
				.list();
		HibernateUtil.getSessionFactory().getCurrentSession().close();
		
		return lstEstatusDetPed;
	}

}
